Zadanie 1

Zadanie 2

kod programu napisany w języku C

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_blas.h>
#include <time.h>

double** zeros(int x1, int y2){
    double** result = malloc(sizeof(double*)*x1);
    for(int i = 0; i < x1; i++){
        result[i] = malloc(sizeof(double)*y2);
        for(int j = 0; j < y2; j++){
            result[i][j] = 0;
        }
    }
    return result;
}

double* zeros1(int x){
    double* result = malloc(sizeof(double)*x);
    for(int i = 0; i < x; i++){
        result[i] = 0;
    }
    return result;
}

double* generate_matrix1(int x){
    double* result = zeros1(x);
    for(int i = 0; i < x; i++){
        result[i] = rand()% 100000;
    }
    return result;
}

double** generate_matrix(int x1, int y2){
    double** result = zeros(x1, y2);
    for(int i = 0; i < x1; i++){
        for(int j = 0; j < y2; j++){
            result[i][j] = rand() % 100000;
        }
    }
    return result;
}

void dealloc_memory(double** matrix, int x1, int y2){
    for(int i = 0; i < x1; i++){
        free(matrix[i]);
    }
    free(matrix);
}

double** naive_multiplication(double** matrix1, double** matrix2, int x1, int y1, int x2, int y2){
    double** result = zeros(x1,y2);
    for(int i = 0; i < x1; i++){
        for(int j = 0; j < y2; j++){
            for(int k = 0; k < y1; k++){
                result[i][j] = result[i][j] + matrix1[i][k]*matrix2[k][j];
            }
        }
    }
    return result;
}

double** better_multiplication(double** matrix1, double** matrix2, int x1, int y1, int x2, int y2){
    double** result = zeros(x1,y2);
    for(int i = 0; i < x1; i++){
        for(int k = 0; k < y1; k++){
            for(int j = 0; j < y2; j++){
                result[i][j] = result[i][j] + matrix1[i][k]*matrix2[k][j];
            }
        }
    }
    return result;
}

int main(){
    srand (time ( NULL));
    int n = 300;
    FILE* report = fopen("raportAcceleration.csv","w");
    for(int i = 1; i < n; i++){
        double** matrix2 = generate_matrix(i, i);
        double* matrix1 = generate_matrix1(i*i);
        for(int j = 0; j < 10; j++){
            double* resultGSL = zeros1(i*i);
            gsl_matrix_view A = gsl_matrix_view_array(matrix1, i, i);
            gsl_matrix_view B = gsl_matrix_view_array(matrix1, i, i);
            gsl_matrix_view C = gsl_matrix_view_array(resultGSL, i, i);

            clock_t start = clock();
            double** result1 = naive_multiplication(matrix2, matrix2,i,i,i,i);
            clock_t end = clock();
            double secondsNaive = (double)(end - start) / CLOCKS_PER_SEC;
            start = clock();
            double** result2 = better_multiplication(matrix2, matrix2,i,i,i,i);
            end = clock();
            double secondsBetter = (double)(end - start) / CLOCKS_PER_SEC;
            start = clock();
            gsl_blas_dgemm (CblasNoTrans, CblasNoTrans,
                      1.0, &A.matrix, &B.matrix,
                      0.0, &C.matrix);
            end = clock();
            double secondsGSL = (double)(end - start) / CLOCKS_PER_SEC;
            fprintf(report, "%d:%lf:%lf:%lf\n",i, secondsNaive, secondsBetter, secondsGSL);
            free(resultGSL);
            dealloc_memory(result1, i, i);
            dealloc_memory(result2, i, i);
        }
        dealloc_memory(matrix2,i,i);
        free(matrix1);
    }
    fclose(report);
    return 0;
}

po dwukrotnym uruchomieniu z różnymi opcjami kompilacji, uzyskuję dwa pliki .csv z których zostaną utworzone ramki danych

Zadanie 3

Zadanie 4

Zadanie 5